Amazon EC2でRHEL9 AMIを使用したときにEC2インスタンスに接続できずつまづいた話
Amazon EC2でRHEL9 AMIを使用したときにEC2インスタンスに接続できずつまづいた話
こんにちは。まるとです。
今回はAmazon EC2でAWS公式で提供しているRedHat Enterprise Linux 9のAMIを利用してEC2インスタンスを起動したとき、AWSマネジメントコンソールからEC2インスタンスに接続できず、悩んだので解決方法をメモします。
先に結論
- 起動直後はSSHを利用して接続する必要がある
- セッションマネージャーを利用する場合、手動でインストールする必要がある
- EC2 Instant Connectを利用する場合は、別途設定が必要
一部のAMIは上記3点が適用されるのでドキュメントを確認しよう
背景
個人で検証する際、Amazon EC2 インスタンスを起動時にAmazon Linux 2023を良く選択するのですが、RedHat Enterprise Linux 9を使用する必要があり、普段通りSystems Managerを利用して接続をしようとしたところ、エンドポイントに接続できないエラーが発生しました。
「あ、SSM エージェントを入れ忘れたな」と思い、EC2 Instance Connectを使用して接続しようとしたところ以下のエラーが出力されました。
Failed to connect to your instance
Error establishing SSH connection to your instance. Try again later.
更にまだ起動中かな?と思い時間をかけて再度試したり、以下の記事に沿って、ネットワークACLやセキュリティグループの見直し、ルートテーブルの確認などトラブルシューティングを行いましたが、同じエラーが表示されます。
しかし、このドキュメントをよく読むと
EC2 Instance Connect を使用してインスタンスに接続するには、インスタンスに EC2 Instance Connect がインストールされている必要があります。
との記載があります。また、EC2 Instance Connectのインストールというドキュメントを読むと以下の記載があります。
注記
以下のいずれかの AMI を使用してインスタンスを起動した場合は、EC2 Instance Connect がプリインストールされているため、このステップをスキップできます。
- AL2023 標準 AMI
- Amazon Linux 2 2.0.20190618 以降
- macOS Sonoma 14.2.1 以降
- macOS Ventura 13.6.3 以降
- macOS Monterey 12.7.2 以降
- Ubuntu 20.04 以降
つまり、上記のAMI以外は別途EC2 Instance Connectを利用するためにパッケージのインストールが必要となります。
クイックスタートタブに表示されているかつ公式のAMIであれば、EC2 Instance Connectをすぐに利用できると自身は勘違いしていました。
どうするか
上記を踏まえて、RedHat Enterprise Linux 9(またはEC2 Instance ConnectがプリインストールされていないAMI)を利用した場合、どのように接続するかを考えていきます。
SSH による接続
一番シンプルな方法です。
ただし、EC2 インスタンスがインターネットに接続されていない場合、インターネットから接続できる踏み台用インスタンスが必要となります。
また、セキュリティグループにインバウンドルールを追加する必要があります。
Systems Manager による接続
多くの方が使いたいと思われるSystems Managerでの接続方法です。
インターネットへの接続が可能な場合、インスタンス起動時にユーザデータにSSM エージェントをインストールするスクリプトを書いておきます。
#!/bin/bash
# ARM系CPUの場合は linux_amd64 を linux_arm64にしてください
cd /tmp
sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
インターネットアクセスがない場合、Amazon S3へのVPCエンドポイントを作成後、作業中リージョンに合わせたS3バケットを指定することでSSM エージェントを取得&インストール可能です。
※ Systems ManagerへのVPCエンドポイントにはすでに作成しているものとします。
#!/bin/bash
# ARM系CPUの場合は linux_amd64 を linux_arm64にしてください
cd /tmp
sudo dnf install --disablerepo="*" -y https://s3.<リージョン>.amazonaws.com/amazon-ssm-<リージョン>/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
以下の記事も参考になるのでおすすめです。
その後、EC2 インスタンスにSystems Managerへのアクセス権が含まれるIAMロールをアタッチすればOKです。
EC2 Instance Connect による接続
基本的には以下のドキュメントに沿って実施します。
EC2を起動する際にインストールするのであれば、以下のbashをユーザデータとして指定します。
なお、インストールに必要なrpmファイルはus-west-2のみとなっているため、インターネットを経由してS3にアクセスできない場合は、別途ファイルを取得してEC2 インスタンス上に転送する必要があります。
#!/bin/bash
# ARM系CPUの場合は linux_amd64 を linux_arm64にしてください
mkdir /tmp/ec2-instance-connect
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux.noarch.rpm -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
sudo yum install -y /tmp/ec2-instance-connect/ec2-instance-connect.rpm /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
まとめ
普段、Amazon Linux 2023を中心に利用していたため、別途インストールなどを意識していませんでしたが、一部AMIではSystems ManagerだけでなくEC2 Instance Connectも別途インストールが必要となることがわかりました。
セキュリティグループなどは問題ないけど、うまくEC2 インスタンスに接続できないことがございましたら、別途インストールが必要か確認してみてください。